// #include <stdio.h>         //标准输入输出定义
// #include <stdlib.h>        //标准函数库定义
// #include <unistd.h>       //Unix标准函数定义
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>          //文件控制定义
// #include <termios.h>     //POSIX中断控制定义
// #include <errno.h>        //错误号定义
// #include <sys/wait.h>
// #include <signal.h>
// #include <sys/time.h>
// #include <string.h>
// #include <sys/socket.h>
// #include <sys/types.h>
// #include <netinet/in.h>
#include <iostream>
#include "TCPServer.h"
#include "ComPort.h"
#include "MessageQueue.h"
#include <unistd.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fstream>

using namespace std;

extern "C" 
{
	#include "lua/lua.h"
	#include "lua/lauxlib.h"
	#include "lua/lualib.h"
}

namespace
{
	inline bool file_exists (const char * name) {
	    ifstream f(name);
	    return f.good();
	}
}

int main(int argc, char const *argv[])
{
	try
	{
		// 准备lua的相关命名空间
		lua_State *L = luaL_newstate();
		if(L == NULL)
		{
			std::cout << "启用Lua栈失败" << std::endl;
		}
		else
		{
			while(1)
			{

				luaL_openlibs(L);

				if(!file_exists("main.lua"))
				{
					std::cout << "没有找到文件 main.lua" << std::endl;
					break;
				}

				if(luaL_loadfile(L, "main.lua"))
				{
					std::cout << "尝试加载 main.lua 文件失败" << std::endl;
					break;
				}


				if(lua_pcall(L,0,0,0))
				{
					std::cout << "运行 main.lua 失败" << lua_tostring(L, -1) << std::endl;
					lua_pop(L, 1);

					// perror("运行 main.lua 失败");
					break;
				}

				break;
			}

			std::cout << "启用Lua站完成" << std::endl;	
		}

		MessageQueue * tcp_mq = new MessageQueue();
		MessageQueue * com_mq = new MessageQueue();

		tcp_server *_tcp_server = new tcp_server(8000);
		_tcp_server->start_recv_msg(tcp_mq);
		_tcp_server->start_send_msg(com_mq);

		com_port *_com_port = new com_port();
		_com_port->start_recv_msg(com_mq);
		_com_port->start_send_msg(tcp_mq);

		std::cout << "业务启动完毕 进入主循环" << std::endl;
		
		while(1)
			sleep(10);

		return 0;
	}
	catch(const char * error)
	{
		std::cout << error << std::endl;
		return 0;
	}
}